home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / raytrace / renaisnc / lib.lha / Lib / randgen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-01-04  |  1.5 KB  |  79 lines

  1. /* ----------------------------------------------------------------------------
  2.  
  3.    File : randgen.c
  4.    Author : Erik Brisson
  5.             James Painter
  6.    Last modified : April 20, 1987
  7.    Purpose : routines for giving random numbers.
  8.  
  9.    -------------------------------------------------------------------------- */
  10. #include <math.h>
  11.  
  12. #define IRANGE 2147483647.0  /* 2^31-1 (range of random() is 0 - IRANGE) */
  13. #define NSTATE_BYTES 32   
  14. int state[NSTATE_BYTES];   /* just has to contain at least NSTATE_BYTES bytes */
  15.  
  16. unsigned seed;
  17. int n_gauss = 5;
  18. double norm_factor;
  19.  
  20. /* ------------------------------------ */
  21.  
  22. init_rand(user_seed)
  23. int user_seed;
  24. {
  25.   seed = (unsigned) user_seed;
  26.   initstate(seed, state, NSTATE_BYTES);
  27.   norm_factor = sqrt(3.0 / (double)n_gauss);
  28.   return;
  29. }
  30.  
  31. /* ------------------------------------ */
  32.  
  33. restart_random()
  34. {
  35.   setstate(state);
  36.   srandom(seed);
  37.   return;
  38. }
  39.  
  40. /* ------------------------------------ */
  41.  
  42. int random_int(i1, i2)  
  43. int i1, i2;  
  44.  {
  45.   double random_unif();
  46.   int i;
  47.  
  48.   i = (int) random_unif(0.0, (double) (i2-i1)+1);
  49.   if (i < 0) i = 0;
  50.   i += i1;
  51.   if (i > i2) i = i2;
  52.   return i;
  53.  }
  54.         
  55. /* ------------------------------------ */
  56.  
  57. double random_unif(low,high)
  58. double low,high;
  59.  {
  60.   long random();
  61.   return (low + (high-low)*((double)random()/IRANGE));
  62.  }
  63.         
  64. /* ------------------------------------ */
  65.  
  66. double gauss(mean,sd)
  67. double mean, sd;
  68.  {
  69.   int i;
  70.   double x, random_unif();
  71.   
  72.   x = 0;
  73.   for (i=0; i<n_gauss ;i++)
  74.     x += random_unif(-1.0,1.0);
  75.   return (mean + sd*norm_factor*x);
  76.  }
  77.  
  78.  
  79.